public class Solution {
    public static void main(String[] args) {
        Solution s = new Solution();
        System.out.println(s.multiply("0", "456"));
    }

    public String multiply(String num1, String num2) {
        /**
         * 字符串相乘：
         *  解法2：对于模拟竖式运算的优化-无进位相加*/
        // 1 预处理
        int m = num1.length();
        int n = num2.length();
        // -反转字符串（因为我们计算是从个位开始）
        StringBuilder s1 = new StringBuilder(num1).reverse();
        StringBuilder s2 = new StringBuilder(num2).reverse();

        // 2 无进位相加
        // -创建存储数组
        long[] arr = new long[m+n-1];
        for(int i = 0; i < m; i++) {
            for(int j = 0; j < n; j++) {
                arr[i+j] += ((long) (s1.charAt(i) - '0') * (s2.charAt(j) - '0'));
            }
        }

        // 3 进位
        long t = 0;
        StringBuilder answer = new StringBuilder();
        for(int i = 0; i < arr.length; i++) {
            t += arr[i];
            answer.append(t%10);
            t /= 10;
        }
        // -若是t中还存在有进位，则逆序后相加
        if(t != 0) {
            answer.append(new StringBuilder(""+t).reverse());
        }

        // 4 逆序并消除前缀0
        answer.reverse();
        int i = 0;
        while(i < answer.length() && answer.charAt(i) == '0') {
            i++;
        }

        // 5 返回值
        if(i == answer.length()) {
            return "0";
        } else {
            return answer.substring(i);
        }
    }
}
